package com.kirayous.api.strategy.template;

import com.kirayous.api.strategy.UploadStrategy;
import com.kirayous.common.exception.MyServeException;
import com.kirayous.common.utils.FileUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author KiraYous
 * @version V1.0
 * @Package com.kirayous.api.strategy.template
 * @date 2021/10/25 20:12
 *
 * 模板方法，为了不让新的类使用到旧类中不合适的方法
 */
public interface AbstractUploadStrategyImpl extends UploadStrategy {
    /**
     *
     * @param file 文件
     * @param path 上传路径
     * @return
     *
     * 主体方法，默认不throw内容
     */
    @Override
    default public String uploadFile(MultipartFile file, String path) {
        try {
            // 获取文件md5值
            String md5 = FileUtils.getMd5(file.getInputStream());
            // 获取文件扩展名
            String extName = FileUtils.getExtName(file.getOriginalFilename());
            // 重新生成文件名
            String fileName = md5 + extName;
            // 判断文件是否已存在
            if (!exists(path + fileName)) {
                // 不存在则继续上传
                upload(path, fileName, file.getInputStream());
            }
            // 返回文件访问路径
            return getFileAccessUrl(path + fileName);
        } catch (Exception e) {
            e.printStackTrace();
            throw new MyServeException("文件上传失败");
        }
    }


    /**
     * 判断文件是否存在
     *
     * @param filePath 文件路径
     * @return {@link Boolean}
     */
    default public Boolean exists(String filePath){
        // throw 的作用是为了不让其他没有实现此方法的对象使用这个方法
        throw new UnsupportedOperationException();
    }

    /**
     * 上传
     *
     * @param path        路径
     * @param fileName    文件名
     * @param inputStream 输入流
     * @throws IOException io异常
     */
    default public  void upload(String path, String fileName, InputStream inputStream) throws IOException{

        throw new UnsupportedOperationException();
    }

    /**
     * 获取文件访问url
     *
     * @param filePath 文件路径
     * @return {@link String}
     */
    default public String getFileAccessUrl(String filePath){

        throw new UnsupportedOperationException();
    }


}
